package tech.xs.common.util;


import tech.xs.common.util.structure.Tree;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class TreeUtil {

    /**
     * 构建树形结构
     *
     * @param list 数据列表
     * @param <T>  数据类型
     * @return 树型结构
     */
    public static <T extends Tree<T>> List<T> buildTree(Collection<T> list) {
        return buildTree(list, false);
    }

    /**
     * 构建树形结构
     *
     * @param list          数据列表
     * @param setFatherNode 是否设置父节点
     * @param <T>           数据类型
     * @return 树型结构
     */
    public static <T extends Tree<T>> List<T> buildTree(Collection<T> list, boolean setFatherNode) {
        List<T> res = new ArrayList<>();
        for (T f : list) {
            if (f.getFatherCode() == null) {
                res.add(f);
            }
            for (T c : list) {
                if (!f.getCode().equals(c.getFatherCode())) {
                    continue;
                }
                Collection<T> children = f.getChildren();
                if (children == null) {
                    children = new ArrayList<T>();
                    f.setChildren(children);
                }
                children.add(c);
                if (setFatherNode) {
                    c.setFather(f);
                }
            }
        }
        return res;
    }


}
